package com.agencia.jsf;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlInputHidden;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;



import agencia.ExcursionMedioDia;
import agencia.ReservaExcursionHotel;
import agencia.persistencia.ExcursionDAO;

	
public class AdministrarReservasExcursionBean {
	
	private HtmlDataTable 				dataTable;
    private ReservaExcursionHotel		dataItem 			= new ReservaExcursionHotel();
    private HtmlInputHidden 			dataItemId 			= new HtmlInputHidden();
    private HtmlInputHidden 			dataItemIdPaquete 	= new HtmlInputHidden();
    private HtmlInputHidden 			dataItemCategoria 	= new HtmlInputHidden();
    private HtmlInputHidden 			dataItemFecha 	 	= new HtmlInputHidden();        
	private List<ReservaExcursionHotel> reservas;
	private List<SelectItem>			excursiones;
	private int 						cantidad = 0;
	private int 						proximoId= 1;
	private Long						idPaquete;
	private int							categoria;
	private Date 						fecha;
	
	

	public Date getFecha() {
		return fecha;
	}


	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}


	public AdministrarReservasExcursionBean() {
		traerRequest();
		cargar();
	}
		

	@SuppressWarnings("deprecation")
	private void cargar(){
		
		Date fechaExcursion = new Date("03/12/08");
		
		reservas = new ArrayList<ReservaExcursionHotel>();
		excursiones = new ArrayList<SelectItem>();
		
		ExcursionDAO excursionDAO = new ExcursionDAO();
		
		Criterion criterioCategoria = Restrictions.eq("categoria", dataItemCategoria.getValue());
		Criterion criterioFecha = Restrictions.ge("fecha", dataItemFecha.getValue());
		
		Criteria criterioExcursion = com.agencia.persistencia.HibernateSessionFactory.getSession().createCriteria(ExcursionMedioDia.class);
		
		criterioExcursion.add(criterioCategoria);
		criterioExcursion.add(criterioFecha);
		
		List<ExcursionMedioDia> listaExcursiones = criterioExcursion.list(); //excursionDAO.findAll();
		Iterator<ExcursionMedioDia> it = listaExcursiones.iterator();
		
		while (it.hasNext()){
			excursiones.add(new SelectItem(it.next()));
		}
		
		//List<ExcursionMedioDia> listaExcursiones = new ArrayList<ExcursionMedioDia>();
		ExcursionMedioDia exc = new ExcursionMedioDia("Safari",fechaExcursion,5);
		ReservaExcursionHotel excursionPaquete = new ReservaExcursionHotel();
		excursionPaquete.setId(Long.valueOf(1));
		excursionPaquete.setNombreExcursion(exc.getNombre());
		excursionPaquete.setFechaDeExcursion(fechaExcursion);
		excursionPaquete.setExcursion(exc);
		
		//excursiones.add(new SelectItem(exc));
		
		/*
		ExcursionmediodiaDAO excursionDAO = new ExcursionmediodiaDAO();
		
		listaExcursiones =  excursionDAO.findAll();		
		
		Iterator<ExcursionMedioDia> it = listaExcursiones.iterator();
		excursiones = new ArrayList<SelectItem>();
		
		while(it.hasNext()){
			excursiones.add(new SelectItem(it.next()));
		}
		*/
		reservas.add(excursionPaquete);
		cantidad++;
		actualizarProximoId();
			
		/*
		 * traer de la bd todas las reservas de excursiones cuyo idPaquete sea igual a idPaquete
		 */
	}
	
	public void actualizarProximoId(){
		proximoId++;		
	}
	
	public int getProximoId(){
		return proximoId;
	}
	
	public String crear() {
		dataItem = new ReservaExcursionHotel();

		cantidad++;
		dataItemId.setValue(new Long(cantidad));
		
		return "editar";
	}

	public String editar() {
		// Obtengo la fila completa
	    dataItem = (ReservaExcursionHotel) dataTable.getRowData();
	    dataItemId.setValue(dataItem.getId());
	
		return "editar";
	}
	
	private void persistirReserva(){
		
	}
	
	public String guardar() {
		
		dataItem.setId(Long.valueOf(dataItemId.getValue().toString()));
		if (cantidad > reservas.size()){
			dataItem.setId(Long.valueOf(getProximoId()));
			persistirReserva();
			reservas.add(dataItem);
			actualizarProximoId();
		}
		
		return "listar";
	}
	
	public String eliminar(){
		dataItem = (ReservaExcursionHotel) dataTable.getRowData();
		eliminarReserva();
		reservas.remove(dataItem);
		cantidad--;
		return "listar";
	}
	private void eliminarReserva(){

	}
	
	public String listar() {
		return null;
	}
	
	public String volver() {
		// Si se creo uno nuevo, vuelvo el conteo hacia atras
		cantidad = reservas.size();

		return "volver";
	}
	
	public void traerRequest(){
		

		FacesContext context = FacesContext.getCurrentInstance();		
		HttpServletRequest request= (HttpServletRequest)context.getExternalContext().getRequest();
		Long idPaquete 	= (Long)request.getSession().getAttribute("idPaquete");
		Long aux  		= (Long)request.getSession().getAttribute("categoria");
		Date fecha      = (Date)request.getSession().getAttribute("fecha");
		setIdPaquete(idPaquete);
		setCategoria(aux.intValue());
		setFecha(fecha);
		
		dataItemIdPaquete.setValue(new Long(getIdPaquete()));
		dataItemCategoria.setValue(aux.intValue());
		dataItemFecha.setValue(fecha);
		
	}

	//-------------------------------------
	
	public HtmlDataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(HtmlDataTable dataTable) {
		this.dataTable = dataTable;
	}

	public ReservaExcursionHotel getDataItem() {
		return dataItem;
	}

	public void setDataItem(ReservaExcursionHotel dataItem) {
		this.dataItem = dataItem;
	}

	public HtmlInputHidden getDataItemId() {
		return dataItemId;
	}

	public void setDataItemId(HtmlInputHidden dataItemId) {
		this.dataItemId = dataItemId;
	}

	public int getCantidad() {
		return cantidad;
	}

	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}

	public List<ReservaExcursionHotel> getReservas() {
		traerRequest();
		cargar();
		return reservas;
	}

	public void setReservas(List<ReservaExcursionHotel> reservas) {
		this.reservas = reservas;
	}


	public HtmlInputHidden getDataItemIdPaquete() {
		return dataItemIdPaquete;
	}


	public void setDataItemIdPaquete(HtmlInputHidden dataItemIdPaquete) {
		this.dataItemIdPaquete = dataItemIdPaquete;
	}


	public Long getIdPaquete() {
		return idPaquete;
	}


	public void setIdPaquete(Long idPaquete) {
		this.idPaquete = idPaquete;
	}


	public List<SelectItem> getExcursiones() {
		return excursiones;
	}


	public void setExcursiones(List<SelectItem> excursiones) {
		this.excursiones = excursiones;
	}


	public int getCategoria() {
		return categoria;
	}


	public void setCategoria(int categoria) {
		this.categoria = categoria;
	}


	public HtmlInputHidden getDataItemCategoria() {
		return dataItemCategoria;
	}


	public void setDataItemCategoria(HtmlInputHidden dataItemCategoria) {
		this.dataItemCategoria = dataItemCategoria;
	}


	public HtmlInputHidden getDataItemFecha() {
		return dataItemFecha;
	}


	public void setDataItemFecha(HtmlInputHidden dataItemFecha) {
		this.dataItemFecha = dataItemFecha;
	}
}
